from .EnvParser import *

__all__ = [
    'getFontSize', # 获取字体大小

    'get_obj_rootpaths', # 获取指定对象的根路径集合
    'get_file_alias', # 获取文件的所有别名

    'get_file_alias_only_name', # 获取别名的文件名列表（不包括后缀名）

    'getDjangoRunHost', # 获取Django的运行地址
    'getDjangoRunPort', # 获取Django的运行端口
    'getPython3Env', # 获取项目运行虚拟环境
    'getPlatform', # 获取当前运行的平台
    'getAllSupportPlatform', # 获取软件已支持的平台类型
    'getSupportEnvPlatform', # 获取软件已支持虚拟环境运行的平台类型
    'getDjangoSupportDatabase', # 获取Django支持的所有数据库
    'getRealPythonOrder', # 获取非虚拟环境的Python命令
    'getConflictFieldsName', # 获取冲突列表里的字段名集合
    'getDjangoOrderArgs', # 获取Django的命令参数形式，如：python manage.py
    'getPipOrderArgs', # 获取虚拟环境pip install命令
    'get_path_by_env_order', # 通过虚拟环境获取 site-packages（默认） 路径 或 其他指定信息 

    'killProgress', # 接收端口，终止进程（将被遗弃的方法）
]

def getFontSize()->int:
    """获取字体大小"""
    obj = ExecEnvParser()
    node = obj.get_xpath_node('page/font-size')
    return int(node.text)

def get_obj_rootpaths(flag: str)->List[str]:
    '''获取指定对象的根路径集合（不包括默认路径）

        现支持参数值：apps、views、models、urls
    '''
    obj = ExecEnvParser()
    return obj.get_childnode_lists(f'paths/obj[name={flag}]')

def get_file_alias(flag: str)->List[str]:
    '''获取文件的所有别名（包括默认文件名）
    
        别名包括文件名和后缀名
        现支持参数值：settings、manage、admin、models、apps、forms、tests、urls、views
    '''
    obj = ExecEnvParser()
    return obj.get_childnode_lists(f'alias/file[name={flag}]')

'''
    别名二次处理
'''

def get_file_alias_only_name(flag)->List[str]:
    '''获取别名的文件名列表（不包括后缀名）
    
        数量一定 >= 1
        现支持参数值：settings、manage、admin、models、apps、forms、tests、urls、views
    '''
    return [os.path.basename(_).split('.')[0] for _ in get_file_alias(flag)]

'''
    环境参数获取
'''

def getDjangoRunHost()->str:
    """获取Django的 ip 运行地址"""
    obj = ExecEnvParser()
    node = obj.get_xpath_node('env/host')
    return node.text if node.text else ''

def getDjangoRunPort()->int:
    """获取Django的运行端口"""
    obj = ExecEnvParser()
    node = obj.get_xpath_node('env/port')
    return int(node.text)

def getPython3Env()->str:
    """获取项目运行虚拟环境python命令"""
    obj = ExecEnvParser()
    node = obj.get_xpath_node('env/python3')
    return node.text if node.text else ''

def getPlatform()->str:
    """获取当前运行的平台"""
    obj = ExecEnvParser()
    node = obj.get_xpath_node('env/platform')
    return node.text if node.text else ''

def getAllSupportPlatform()->List[str]:
    """获取软件已支持的平台类型"""
    obj = ExecEnvParser()
    return obj.get_childnode_lists('env/support[name=all]')

def getSupportEnvPlatform()->List[str]:
    """获取软件已支持虚拟环境运行的平台类型"""
    obj = ExecEnvParser()
    return obj.get_childnode_lists('env/support[name=virtualenv]')

def getDjangoSupportDatabase()->List[str]:
    """获取Django支持的所有数据库"""
    obj = ExecEnvParser()
    return obj.get_childnode_lists('env/database')

def getRealPythonOrder()->str:
    """获取非虚拟环境的Python命令
    
        即本地的 Python 环境
    """
    obj = ExecEnvParser()
    node = obj.get_xpath_node('env/real/python3')
    return node.text

def getConflictFieldsName():
    """获取冲突列表里的字段名集合"""
    obj = ExecEnvParser()
    return obj.get_childnode_lists('conflict-list/field-name')

def getDjangoOrderArgs(mode: str = 'manage.py')->str:
    """获取Django的命令参数形式，如：python manage.py"""
    path = os.path.join(get_configs(CONFIG_PATH)['dirname'], mode)
    env_python3 = os.path.splitext(getPython3Env())[0]
    return f"{env_python3} {path}"

def getPipOrderArgs(mode = 'install'):
    """获取虚拟环境pip install命令"""
    env_python3_pip = os.path.join(os.path.dirname(getPython3Env()), 'pip')
    return f'{env_python3_pip} {mode}'

def get_path_by_env_order(order: str = None):
    """ 通过虚拟环境获取 site-packages（默认） 路径 或 其他指定信息 
    
        虚拟路径不存在返回 None
    """
    env_python3 = getPython3Env()
    if not os.path.exists(env_python3):
        # RichMsgDialog.showOkMsgDialog(None, "检测到虚拟环境未绑定，数据显示可能不准确，请绑定后返回本界面刷新显示", "警告")
        return None # "虚拟路径不存在"
    
    if not order: order = SITE_PACKAGES_PATH # 获取执行脚本
    import subprocess
    p = subprocess.Popen(f'{env_python3} {order}', shell=True, stdout=subprocess.PIPE)
    out, err = p.communicate()
    return out.decode(encoding='utf-8').strip().strip("\n")

'''
    附加方法
'''

def killProgress(port = None):
    """终止进程"""
    import subprocess, platform
    p = platform.system()
    if not port:
        port = getDjangoRunPort()
    if p.lower() == 'linux': # 企鹅系统
        pass
    elif p.lower() == 'windows': # 微软系统
        p = subprocess.Popen(f'netstat -ano |findstr {port}', shell=True, stdout=subprocess.PIPE)
        out, err = p.communicate()
        temp = []
        for line in out.splitlines():
            try:
                jc = [_ for _ in line.decode(encoding='utf-8').split(' ') if _][-1]
                temp.append(jc)
            except: ...
        for _ in set(temp):
            t = subprocess.Popen(f'taskkill /f /t /im {_}', shell=True)
            t.wait()
    elif p.lower() == 'darwin':
        pass
    else: # 其他系统
        raise Exception('UnKnown system.')
